#!/usr/bin/perl
##########################################################################################################################
##### a script to add emoticons to Wigan-Warriors.com
##########################################################################################################################

##########################################################################################################################
######  TODO list  #######################################################################################################
##########################################################################################################################
##########################################################################################################################

##########################################################################################################################
###### Bug list
##########################################################################################################################
##########################################################################################################################

##########################################################################################################################
# Includes
##########################################################################################################################

use lib qw(../cgi-bin);
use Time::Local qw(timelocal);
use CGI;

use WiganRL;
use Diva::DB;
use Diva::DataObject;
use WiganRL::DataObject qw(:constants);
use WiganRL::DataObject::View;
use WiganRL::Search;

use Getopt::Long;
use File::Glob;
use File::Basename;

use strict;
#use warnings;

$|++;  #unbuffered

##########################################################################################################################
# get arguments
##########################################################################################################################

##########################################################################################################################
# site setup and location variable declarations
##########################################################################################################################
my $cfg= WiganRL::DataObject->load_config('wiganrl.ini');

my $cgi= CGI->new();

my $dbh= Diva::DB->new();
$dbh->set( {
	DATABASE_NAME       => $cfg->val('database', 'DATABASE_NAME'),
	DATABASE_SERVER     => $cfg->val('database', 'DATABASE_SERVER'),
	DATABASE_USERNAME   => $cfg->val('database', 'DATABASE_USERNAME'),
	DATABASE_PASSWORD   => $cfg->val('database', 'DATABASE_PASSWORD'),
	DATABASE_TYPE       => $cfg->val('database', 'DATABASE_TYPE'),
	} );
$dbh->connect();
$dbh->debug(0);
WiganRL::DataObject->dbh($dbh);
WiganRL::Search->dbh($dbh);
WiganRL::DataObject->init_class('WWCOM');  #loads contenttypes

#get view threads
my ($sth,$rv)= $dbh->get(['OBJECT','VIEW'],['*'],'',
	"VIEW.FK_OBJECT_ID=OBJECT.PK_OBJECT_ID and OBJECT.FK_CONTENTTYPE_ID = 3",
	"FK_HEAD_ID","",'','');

while (my $reshash= $sth->fetchrow_hashref) {
	WiganRL::DataObject->init_class();
	WiganRL::Search->init_class();
	if (!$reshash->{FK_HEAD_ID}) {
		print "Found object with blank head: $reshash->{PK_OBJECT_ID}\n";
		next;
	}
	#get head
	my ($sth,$rv)= $dbh->get(['OBJECT','CONTENT_TYPE'],['*'],'',
		"FK_CONTENTTYPE_ID=PK_CONTENTTYPE_ID and PK_OBJECT_ID = '".$reshash->{FK_HEAD_ID}."'",'','','','');
	if ($rv==0) {
		print "Failed to get head object: $reshash->{FK_HEAD_ID}\n";
		next;
	}
	my $h_hash= $sth->fetchrow_hashref;
	$sth->finish;

	#get most recent view
	($sth,$rv)= $dbh->get(['OBJECT','VIEW'],['*'],'',
		"VIEW.FK_OBJECT_ID=OBJECT.PK_OBJECT_ID and FK_HEAD_ID = '".$reshash->{FK_HEAD_ID}."'",
		'',"OBJECT_DATE desc","",1);
	if ($rv==0) {
		print "Failed to get last post object: $reshash->{FK_HEAD_ID}\n";
		next;
	}
	my $lp_hash= $sth->fetchrow_hashref;
	$sth->finish;


	print "Procesing thread head: $h_hash->{PK_OBJECT_ID}\n";

	# get num pages
	my $plinks= '';
	my $s= WiganRL::Search->new;
	$s->clear; $s->table('VIEW');
	$s->where('FK_HEAD_ID = '.$reshash->{'FK_HEAD_ID'});
	$s->orderby('OBJECT_DATE');
	my $res= $s->search;
	my $n_per_page= 10;
	my $nres= $#$res;
	for my $i (0..int($nres/$n_per_page)) {
		$plinks.= "," if ($plinks);
		$plinks.= $$res[$i*$n_per_page]->id;
	}                    


	my $replies= $#$res;
	my $nviews= $res->[0]->sum_data('OBJECT_NVIEWS');

	#make message links for thread
	my $list= WiganRL::DataObject->new;
	$list->template("View.Thread.Head.html");
	for my $o (@$res) {
		$o->template("View.Thread.Link.html");
		$list->add_object($o);            
	}           
	my $vt_mlinks= $list->output;

	my $postids= '';
	for (@$res) {
		$postids.= ',' if ($postids ne '');
		$postids.= $_->id;
	}

	$rv= $dbh->replace('VIEW_THREAD',['FK_HEAD_ID','VT_HEAD_DATE','VT_HEAD_TYPE',
		'VT_HEADPOST_ID','VT_STICKY',
		'VT_LASTPOST_ID','VT_LASTPOST_DATE','VT_POST_IDS',
		'VT_NREPLIES','VT_NVIEWS',
		'VT_PAGESTART_IDS','VT_LINKS_HTML'],
		[[$reshash->{FK_HEAD_ID},"'".$h_hash->{OBJECT_DATE}."'",$h_hash->{CONTENTTYPE_NAME},
		$res->[$#$res]->id,$res->[0]->data('VIEW_STICKY'),
		$lp_hash->{PK_OBJECT_ID},$lp_hash->{OBJECT_DATE},$postids,
		$replies,$nviews,
		$plinks,$vt_mlinks]]); 

	WiganRL::DataObject->garbage_collect;
	WiganRL::DataObject->search->garbage_collect;
}

$sth->finish;
exit(0);

#sub load_config {
#	my $inifile= shift;
#	
#  ### get path for ini file
#  my($pack,$file,$line,$sub) = caller;
#  my($dev,$dirs,$id) = File::Spec->splitpath($file);
#  my $IniFile = $dev . $dirs . $inifile;
#
#  ### check file exists
#  if (!(-e $IniFile)) {
#	  die "$IniFile does not exist";
#  }
#  
#  ### get contents of ini file
#  use Config::IniFiles;
#  my $cfg = new Config::IniFiles( -file => $IniFile ) 
#  || die "Could not read $IniFile\n";
#
#  ### Paths
#	$SITE_BASE_URL= $cfg->val('paths', 'SITE_BASE_URL');
#	$SITE_BASE_DIR= $cfg->val('paths', 'SITE_BASE_DIR');
#	$SITE_DATA_DIR= $cfg->val('paths', 'SITE_DATA_DIR');
#	$CGI_BASE_URL= $cfg->val('paths', 'CGI_BASE_URL');
#	$CGI_BASE_DIR= $cfg->val('paths', 'CGI_BASE_DIR');
#	
#  ### emails
#	$SEND_EMAILS= $cfg->val('emails', 'SEND_EMAILS');
#	$EMAIL_BASE_DIR= $cfg->val('emails', 'EMAIL_BASE_DIR');
#	$MAIL_SMTP_SERVER= $cfg->val('emails', 'MAIL_SMTP_SERVER');
#	$ADMIN_NAME= $cfg->val('emails', 'ADMIN_NAME');
#	$ADMIN_EMAIL= $cfg->val('emails', 'ADMIN_EMAIL');
#	$MAIL_SCRIPT= $cfg->val('emails', 'MAIL_SCRIPT');
#
#	### database
#	$DATABASE_NAME= $cfg->val('database', 'DATABASE_NAME');
#	$DATABASE_SERVER= $cfg->val('database', 'DATABASE_SERVER');
#	$DATABASE_USERNAME= $cfg->val('database', 'DATABASE_USERNAME');
#	$DATABASE_PASSWORD= $cfg->val('database', 'DATABASE_PASSWORD');
#	$DATABASE_TYPE= $cfg->val('database', 'DATABASE_TYPE');
#	
#	return;
#}


